﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DDD {


    /// <summary>
    /// シェーダー変数宣言
    /// </summary>
    /// <remarks>
    /// <see cref="ShaderProgram"/>をコンパイル&amp;リンクすると中で使用されるシェーダー変数が確定
    /// <see cref="ShaderProgram.Attributes"/>または<see cref="ShaderProgram.Uniforms"/>で
    /// シェーダー変数宣言を取得できるようになります。
    /// シェーダー変数宣言はUniform変数とAttribute変数の両方共通で使用します。
    /// <dic>Name</dic>は変数名で、<dic>ComponentType</dic>が型、配列の場合は<dic>ArrayLength</dic>で要素数が所得できます。
    /// でAtribute変数の場合のみ<dic>Location</dic>がインデックスを指します。
    /// ユーザーが<dic>ShaderDeclaration</dic>型を直接インスタンス化する事はできません。
    /// 必ずエンジン側が作成したものを戻り値で受け取ります。
    /// </remarks>
    public struct ShaderDeclaration {
        /// <summary>
        /// コンストラクター
        /// </summary>
        /// <param name="name">変数名</param>
        /// <param name="type">シェーダー変数の型</param>
        /// <param name="arrayLength">配列の要素数</param>
        /// <param name="location">ロケーション</param>
        /// <param name="index">インデックス</param>
        internal ShaderDeclaration (string name, ShaderVariableType type, int arrayLength, int location, int index)
            : this () {
            this.Name = name;
            this.Type = type;
            this.ArrayLength = arrayLength;
            this.Location = location;
            this.Index = index;
        }

        /// <summary>
        /// 変数名
        /// </summary>
        public string Name { get; private set; }

        /// <summary>
        /// 変数の型
        /// </summary>
        public ShaderVariableType Type { get; private set; }

        /// <summary>
        /// 配列の要素数(スカラー型の場合は1)
        /// </summary>
        public int ArrayLength { get; private set; }

        /// <summary>
        /// ロケーション
        /// </summary>
        public int Location { get; private set; }

        /// <summary>
        /// インデックス
        /// </summary>
        public int Index { get; private set; }

        /// <summary>
        /// 
        /// </summary>
        public override string ToString () {
            return string.Format("{1} {0}[{2}]", Name, Type, ArrayLength, Location, Index);
        }
    }
}
